cssnode: Change style-changed signal
authorBenjamin Otte <otte@redhat.com>
Sat, 12 Dec 2015 01:02:04 +0000 (02:02 +0100)
committerBenjamin Otte <otte@redhat.com>
Sat, 12 Dec 2015 01:16:04 +0000 (02:16 +0100)
Instead of having old and new style, now have a GtkCssStyleChange opaque
object that will compute the changes you are interested in for you.

This simplifies change signal handlers quite a bit and avoids lots of
repeated computation in every signal handler.

24 files changed:
gtk/Makefile.am
gtk/gtkaccellabel.c
gtk/gtkcheckbutton.c
gtk/gtkcheckmenuitem.c
gtk/gtkcssnode.c
gtk/gtkcssnodeprivate.h
gtk/gtkcssstylechange.c [new file with mode: 0644]
gtk/gtkcssstylechangeprivate.h [new file with mode: 0644]
gtk/gtkcsswidgetnode.c
gtk/gtkexpander.c
gtk/gtklevelbar.c
gtk/gtkmenu.c
gtk/gtkmenuitem.c
gtk/gtkmodelbutton.c
gtk/gtknotebook.c
gtk/gtkpaned.c
gtk/gtkprogressbar.c
gtk/gtkrange.c
gtk/gtkspinbutton.c
gtk/gtkswitch.c
gtk/gtktextview.c
gtk/gtkwindow.c
gtk/inspector/css-node-tree.c
gtk/inspector/gtktreemodelcssnode.c

index 9659e983400db5881df3bb414c5832d27161177c..6de7f4a3c552591904b496b0001ce332f7ccf7cd 100644 (file)
@@ -425,6 +425,7 @@ gtk_private_h_sources =             \
        gtkcssstaticstyleprivate.h      \
        gtkcssstringvalueprivate.h      \
        gtkcssstylefuncsprivate.h \
+       gtkcssstylechangeprivate.h      \
        gtkcssstyleprivate.h    \
        gtkcssstylepropertyprivate.h \
        gtkcsstransformvalueprivate.h   \
@@ -673,6 +674,7 @@ gtk_base_c_sources =                \
        gtkcssselector.c        \
        gtkcssstringvalue.c     \
        gtkcssstyle.c           \
+       gtkcssstylechange.c     \
        gtkcssshadowsvalue.c    \
        gtkcssshadowvalue.c     \
        gtkcssshorthandproperty.c \
index e4bbdd0efb335880dd9d4917a872d10ae7e20950..bd2a180662334bbcd9a7e0a76bf32a30d79bc94a 100644 (file)
@@ -268,26 +268,14 @@ gtk_accel_label_get_property (GObject    *object,
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget    *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index 0b4ed9a64b9b3e19eef5d616a6b2e947c9118f97..c0eed7257ffe30bfe2c6448fc5f71649c7093e46 100644 (file)
@@ -209,26 +209,14 @@ G_GNUC_END_IGNORE_DEPRECATIONS
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget    *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index f1aa0a7f87a3082c4b381b3f0738c2bacdd3dc17..d8654a9d8e2a7be1e8ddbb313639df38c8300f97 100644 (file)
@@ -525,26 +525,14 @@ gtk_check_menu_item_get_draw_as_radio (GtkCheckMenuItem *check_menu_item)
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget    *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index be4b9d1fd485475164a72b32debd719faf6f7e50..9df217abe821f1e91efebf18f310212e204aa6df 100644 (file)
@@ -106,6 +106,11 @@ enum {
   NUM_PROPERTIES
 };
 
+struct _GtkCssNodeStyleChange {
+  GtkCssStyle *old_style;
+  GtkCssStyle *new_style;
+};
+
 static guint cssnode_signals[LAST_SIGNAL] = { 0 };
 static GParamSpec *cssnode_properties[NUM_PROPERTIES];
 
@@ -577,14 +582,11 @@ gtk_css_node_real_node_added (GtkCssNode *parent,
 }
 
 static void
-gtk_css_node_real_style_changed (GtkCssNode  *cssnode,
-                                 GtkCssStyle *old_style,
-                                 GtkCssStyle *new_style)
+gtk_css_node_real_style_changed (GtkCssNode        *cssnode,
+                                 GtkCssStyleChange *change)
 {
-  g_object_ref (new_style);
-  g_object_unref (old_style);
-
-  cssnode->style = new_style;
+  g_object_unref (cssnode->style);
+  cssnode->style = g_object_ref (gtk_css_style_change_get_new_style (change));
 }
 
 static void
@@ -638,9 +640,9 @@ gtk_css_node_class_init (GtkCssNodeClass *klass)
                  G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (GtkCssNodeClass, style_changed),
                  NULL, NULL,
-                 _gtk_marshal_VOID__OBJECT_OBJECT,
-                 G_TYPE_NONE, 2,
-                 GTK_TYPE_CSS_STYLE, GTK_TYPE_CSS_STYLE);
+                 _gtk_marshal_VOID__POINTER,
+                 G_TYPE_NONE, 1,
+                 G_TYPE_POINTER);
 
   cssnode_properties[PROP_CLASSES] =
     g_param_spec_boxed ("classes", "Classes",
@@ -947,10 +949,17 @@ static gboolean
 gtk_css_node_set_style (GtkCssNode  *cssnode,
                         GtkCssStyle *style)
 {
+  GtkCssStyleChange change;
+
   if (cssnode->style == style)
     return FALSE;
 
-  g_signal_emit (cssnode, cssnode_signals[STYLE_CHANGED], 0, cssnode->style, style);
+  gtk_css_style_change_init (&change, cssnode->style, style);
+
+  g_signal_emit (cssnode, cssnode_signals[STYLE_CHANGED], 0, &change);
+
+  gtk_css_style_change_finish (&change);
+
   return TRUE;
 }
 
index 7577d4808abf35eea48c528de3b59783ebcf899b..8624a51678410bf7aa42b96e754a2724c7d0d6c7 100644 (file)
@@ -19,6 +19,7 @@
 #define __GTK_CSS_NODE_PRIVATE_H__
 
 #include "gtkcssnodedeclarationprivate.h"
+#include "gtkcssstylechangeprivate.h"
 #include "gtkbitmaskprivate.h"
 #include "gtkcsstypesprivate.h"
 
@@ -31,7 +32,7 @@ G_BEGIN_DECLS
 #define GTK_IS_CSS_NODE_CLASS(obj)  (G_TYPE_CHECK_CLASS_TYPE (obj, GTK_TYPE_CSS_NODE))
 #define GTK_CSS_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CSS_NODE, GtkCssNodeClass))
 
-typedef struct _GtkCssNodeClass      GtkCssNodeClass;
+typedef struct _GtkCssNodeClass         GtkCssNodeClass;
 
 struct _GtkCssNode
 {
@@ -70,8 +71,7 @@ struct _GtkCssNodeClass
                                                          GtkCssNode            *child,
                                                          GtkCssNode            *previous);
   void                  (* style_changed)               (GtkCssNode            *cssnode,
-                                                         GtkCssStyle           *old_style,
-                                                         GtkCssStyle           *new_style);
+                                                         GtkCssStyleChange     *style_change);
 
   gboolean              (* init_matcher)                (GtkCssNode            *cssnode,
                                                          GtkCssMatcher         *matcher);
diff --git a/gtk/gtkcssstylechange.c b/gtk/gtkcssstylechange.c
new file mode 100644 (file)
index 0000000..49cbc1c
--- /dev/null
@@ -0,0 +1,97 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2015 Benjamin Otte <otte@gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gtkcssstylechangeprivate.h"
+
+#include "gtkcssstylepropertyprivate.h"
+
+void
+gtk_css_style_change_init (GtkCssStyleChange *change,
+                           GtkCssStyle       *old_style,
+                           GtkCssStyle       *new_style)
+{
+  change->old_style = g_object_ref (old_style);
+  change->new_style = g_object_ref (new_style);
+
+  change->n_compared = 0;
+
+  change->affects = 0;
+  change->has_change = FALSE;
+}
+
+void
+gtk_css_style_change_finish (GtkCssStyleChange *change)
+{
+  g_object_unref (change->old_style);
+  g_object_unref (change->new_style);
+}
+
+GtkCssStyle *
+gtk_css_style_change_get_old_style (GtkCssStyleChange *change)
+{
+  return change->old_style;
+}
+
+GtkCssStyle *
+gtk_css_style_change_get_new_style (GtkCssStyleChange *change)
+{
+  return change->new_style;
+}
+
+static gboolean
+gtk_css_style_compare_next_value (GtkCssStyleChange *change)
+{
+  if (change->n_compared == GTK_CSS_PROPERTY_N_PROPERTIES)
+    return FALSE;
+
+  if (!_gtk_css_value_equal (gtk_css_style_get_value (change->old_style, change->n_compared),
+                             gtk_css_style_get_value (change->new_style, change->n_compared)))
+    {
+      change->has_change = TRUE;
+      change->affects |= _gtk_css_style_property_get_affects (_gtk_css_style_property_lookup_by_id (change->n_compared));
+    }
+
+  change->n_compared++;
+
+  return TRUE;
+}
+
+gboolean
+gtk_css_style_change_has_change (GtkCssStyleChange *change)
+{
+  do {
+    if (change->has_change)
+      return TRUE;
+  } while (gtk_css_style_compare_next_value (change));
+
+  return FALSE;
+}
+
+gboolean
+gtk_css_style_change_affects (GtkCssStyleChange *change,
+                              GtkCssAffects      affects)
+{
+  do {
+    if (change->affects & affects)
+      return TRUE;
+  } while (gtk_css_style_compare_next_value (change));
+
+  return FALSE;
+}
+
diff --git a/gtk/gtkcssstylechangeprivate.h b/gtk/gtkcssstylechangeprivate.h
new file mode 100644 (file)
index 0000000..2fb2aa3
--- /dev/null
@@ -0,0 +1,51 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2015 Benjamin Otte <otte@gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GTK_CSS_STYLE_CHANGE_PRIVATE_H__
+#define __GTK_CSS_STYLE_CHANGE_PRIVATE_H__
+
+#include "gtkcssstyleprivate.h"
+
+G_BEGIN_DECLS
+
+typedef struct _GtkCssStyleChange GtkCssStyleChange;
+
+struct _GtkCssStyleChange {
+  GtkCssStyle   *old_style;
+  GtkCssStyle   *new_style;
+
+  guint          n_compared;
+
+  GtkCssAffects  affects;
+  guint          has_change :1;
+};
+
+void            gtk_css_style_change_init               (GtkCssStyleChange      *change,
+                                                         GtkCssStyle            *old_style,
+                                                         GtkCssStyle            *new_style);
+void            gtk_css_style_change_finish             (GtkCssStyleChange      *change);
+
+GtkCssStyle *   gtk_css_style_change_get_old_style      (GtkCssStyleChange      *change);
+GtkCssStyle *   gtk_css_style_change_get_new_style      (GtkCssStyleChange      *change);
+
+gboolean        gtk_css_style_change_has_change         (GtkCssStyleChange      *change);
+gboolean        gtk_css_style_change_affects            (GtkCssStyleChange      *change,
+                                                         GtkCssAffects           affects);
+
+G_END_DECLS
+
+#endif /* __GTK_CSS_STYLE_CHANGE_PRIVATE_H__ */
index 63c4b5bd1e4e10816e18a43eb5f7a8269e4d3920..e6dc7019a6181609cd244a2994432b572701b66d 100644 (file)
@@ -45,9 +45,8 @@ gtk_css_widget_node_finalize (GObject *object)
 }
 
 static void
-gtk_css_widget_node_style_changed (GtkCssNode   *cssnode,
-                                   GtkCssStyle  *old_style,
-                                   GtkCssStyle  *new_style)
+gtk_css_widget_node_style_changed (GtkCssNode        *cssnode,
+                                   GtkCssStyleChange *change)
 {
   GtkCssWidgetNode *node;
 
@@ -56,9 +55,11 @@ gtk_css_widget_node_style_changed (GtkCssNode   *cssnode,
   if (node->widget)
     gtk_widget_clear_path (node->widget);
 
-  GTK_CSS_NODE_CLASS (gtk_css_widget_node_parent_class)->style_changed (cssnode, old_style, new_style);
+  GTK_CSS_NODE_CLASS (gtk_css_widget_node_parent_class)->style_changed (cssnode, change);
 
-  node->accumulated_changes = gtk_css_style_add_difference (node->accumulated_changes, new_style, old_style);
+  node->accumulated_changes = gtk_css_style_add_difference (node->accumulated_changes,
+                                                            gtk_css_style_change_get_new_style (change),
+                                                            gtk_css_style_change_get_old_style (change));
 }
 
 static gboolean
index c75aafd202e690e668ad174d7ccfef38e174f61e..68988881cef82d7d3c8324ccdc803bdde562d2a7 100644 (file)
@@ -383,26 +383,14 @@ gtk_expander_class_init (GtkExpanderClass *klass)
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget   *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index a5374edd63baf0d82a4ddfd99d2b728806f5a807..2477d12ba65e88fb8f831544150d623a862e3742 100644 (file)
@@ -574,26 +574,14 @@ gtk_level_bar_size_allocate (GtkWidget     *widget,
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget   *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index 771362dcd3a83d19728dbf5f64256480159e8656..59dfb4aaad5a184cec5521555ef5e64c89aef36b 100644 (file)
@@ -1095,26 +1095,14 @@ gtk_menu_window_event (GtkWidget *window,
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget   *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-  
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-  
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-  
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-  
-  _gtk_bitmask_free (changes);
 }
 
 static void
index b36bc1b0482a3c327074a13300534bf3150a21fd..252b93ca8db3f4c462a305803d9459b18984fd8f 100644 (file)
@@ -1328,26 +1328,14 @@ gtk_menu_item_set_use_action_appearance (GtkMenuItem *menu_item,
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget   *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index 3958345260b7f9d1380b553bee0cb563ac6fb9d1..e9f3132eebe304ea9c30393ac15172a1ae5bb9b3 100644 (file)
@@ -1086,26 +1086,14 @@ gtk_model_button_class_init (GtkModelButtonClass *class)
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget    *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-  
-  _gtk_bitmask_free (changes);
 }
 
 static void
index 91af61ba37ba97e17653677d474b6a4088c111fe..bb50c0bab16ef2480901e930a45fefae99197129 100644 (file)
@@ -1210,26 +1210,14 @@ gtk_notebook_class_init (GtkNotebookClass *class)
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget   *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index 246d6cc34b9c5e2b1b469325be8a5cd6cfa03fc2..f7c8da83a329ebea2f0044768776c4309017cd72 100644 (file)
@@ -785,26 +785,14 @@ pan_gesture_drag_end_cb (GtkGestureDrag *gesture,
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget    *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index 2b325e1b6ef35c9d1bd67985ac526f4cd519fd77..0a845a0148c30086828c78d0b3cccf82b4604502 100644 (file)
@@ -345,26 +345,14 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class)
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget   *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index 6e225bd0f0cb21220ad898d287c0f9d193063179..e177ac79af62bacfda4e8b1b43cd4c790ce4b193 100644 (file)
@@ -730,26 +730,14 @@ gtk_range_get_property (GObject      *object,
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget   *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index 27f60d3b6a0eb6df70809a558ce6e5621c0d25a3..35a59ccb4989dd3a2df12434be9a705adc2c2611 100644 (file)
@@ -726,26 +726,14 @@ swipe_gesture_update (GtkGesture       *gesture,
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget    *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index 764820924d98040d629361f50a8c33f42b872e4b..f4e5e04c7340f0a54930bb301ef002c550af8ac8 100644 (file)
@@ -870,26 +870,14 @@ state_set (GtkSwitch *sw, gboolean state)
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget   *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index eb43db5f91ffeaeef57e57b9e321ac543c84d1ac..d6c4aa1c5772f40a847cc8065d9ad4137d73ac97 100644 (file)
@@ -9741,26 +9741,14 @@ gtk_text_view_selection_bubble_popup_set (GtkTextView *text_view)
 /* Child GdkWindows */
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget    *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index b8476c0b47b8760b736fc981a86f38ecdd7bd775..97c6e1f0c3d1be0ec75039f50dff30df700f4486 100644 (file)
@@ -1597,26 +1597,14 @@ drag_gesture_update_cb (GtkGestureDrag *gesture,
 }
 
 static void
-node_style_changed_cb (GtkCssNode  *node,
-                       GtkCssStyle *old_style,
-                       GtkCssStyle *new_style,
-                       GtkWidget   *widget)
+node_style_changed_cb (GtkCssNode        *node,
+                       GtkCssStyleChange *change,
+                       GtkWidget         *widget)
 {
-  GtkBitmask *changes;
-  static GtkBitmask *affects_size = NULL;
-
-  if (G_UNLIKELY (affects_size == NULL))
-    affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP);
-
-  changes = _gtk_bitmask_new ();
-  changes = gtk_css_style_add_difference (changes, old_style, new_style);
-
-  if (_gtk_bitmask_intersects (changes, affects_size))
+  if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  _gtk_bitmask_free (changes);
 }
 
 static void
index bd0ec29ca59826f58b14671b6eb651654f711c3b..8812398d3b24d793b56ac0258ed26ab10d2b9f87 100644 (file)
@@ -533,13 +533,15 @@ gtk_inspector_css_node_tree_set_object (GtkInspectorCssNodeTree *cnt,
 
 static void
 gtk_inspector_css_node_tree_update_style (GtkCssNode              *node,
-                                          GtkCssStyle             *old_style,
-                                          GtkCssStyle             *new_style,
+                                          GtkCssStyleChange       *change,
                                           GtkInspectorCssNodeTree *cnt)
 {
   GtkInspectorCssNodeTreePrivate *priv = cnt->priv;
+  GtkCssStyle *new_style;
   gint i;
 
+  new_style = gtk_css_style_change_get_new_style (change);
+
   for (i = 0; i < _gtk_css_style_property_get_n_properties (); i++)
     {
       GtkCssStyleProperty *prop;
@@ -586,6 +588,7 @@ gtk_inspector_css_node_tree_set_node (GtkInspectorCssNodeTree *cnt,
                                       GtkCssNode              *node)
 {
   GtkInspectorCssNodeTreePrivate *priv = cnt->priv;
+  GtkCssStyleChange change;
   GString *s;
   GType type;
   const gchar *name;
@@ -598,11 +601,16 @@ gtk_inspector_css_node_tree_set_node (GtkInspectorCssNodeTree *cnt,
   if (node)
     g_object_ref (node);
 
+  gtk_css_style_change_init (&change,
+                             node ? gtk_css_node_get_style (node) : NULL,
+                             priv->node ? gtk_css_node_get_style (priv->node) : NULL);
+
   gtk_inspector_css_node_tree_update_style (node,
-                                            node ? gtk_css_node_get_style (node) : NULL,
-                                            priv->node ? gtk_css_node_get_style (priv->node) : NULL,
+                                            &change,
                                             cnt);
 
+  gtk_css_style_change_finish (&change);
+
   gtk_inspector_css_node_tree_unset_node (cnt);
 
   priv->node = node;
index ee55211d0bc44b291385f54f03c742f61eee0c64..0af42b167f5bebed4c02eaea380184aa11b80106 100644 (file)
@@ -450,8 +450,7 @@ notify_cb (GtkCssNode          *node,
 
 static void
 style_changed_cb (GtkCssNode          *node,
-                  GtkCssStyle         *old_style,
-                  GtkCssStyle         *new_style,
+                  GtkCssStyleChange   *change,
                   GtkTreeModelCssNode *model)
 {
   GtkTreeIter iter;